package com.sun.filesigndemo.common.redis;

import org.springframework.data.redis.core.ZSetOperations;

import java.util.BitSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface CacheService {
	boolean set(final String key, final Object value);

	/**
	 *
	 * @param key
	 * @param value
	 * @param exp 秒
	 * @return
	 */
	boolean set(final String key, final Object value, final Long exp);

	boolean hasKey(String key);

	boolean putHash(String key, Object fieldKey, Object fieldValue);

	<T> T getHash(String key, Object fieldKey);

	Long getHashSize(String key);

	Set<Object> getHashKeys(String key);

	List<Object> getHashValues(String key);

    boolean hasHashKey(String key, Object fieldKey);

	Map<String, Object> getHash(String key);

	boolean deleteHash(String key, Object fieldKey);

    boolean deleteHash(String key);

	<T> T get(final String key);

	boolean delete(final String key);

	/**
	 * 模糊删除key key*
	 * @param key
	 * @return
	 */
	boolean deleteAbstract(String key);

	boolean setSerializer(final String key, final Object value, final Long exp);

	boolean setSerializer(final String key, final Object value);

	<T> T getSerializer(final String key, Class<?> clazz);

	boolean addSetMember(String key, Object... members);

	boolean hasSetMember(String key, Object member);

	Set<String> getKeys(String pattern);
	/**
	 * 获取hash表下的所有属性字段
	 * @param key (不支持通配符)
	 * @return
	 */
	Set<String> getHashTableFields(String key);

	/**
	 * 设置延期
	 * @param key
	 * @param timeout 延期时长  单位:秒
 	 * @return
	 */
	boolean setExpire(String key, long timeout);

	/**
	 * 获取超时
	 * @param key
	 * @return
	 */
	long getExpire(String key);

	/**
	 * 批量删除符合模版key的数据
	 * @param pattern
	 * @return
	 * boolean
	 * @date 2015年11月4日
	 */
	boolean deleteByPattern(final String pattern);

	/**
	 * 有序集合数据添加
	 * @param key
	 * @param value
	 * @param score
	 * @return boolean
	 * @date 2015年11月10日
	 */
	boolean addZSetMember(String key, Object value, double score);

	/**
	 * 返回根据分数排序的集合列表，返回全部 start=0,end=-1
	 * @param key
	 * @param start
	 * @param end
	 * @return Set<TypedTuple<Object>>
	 * @date 2015年11月11日
	 */
	Set<ZSetOperations.TypedTuple<Object>> zSetWithScores(String key, long start, long end);

	Set<ZSetOperations.TypedTuple<Object>> zSetReverseRangeWithScores(String key, long start, long end);

	/**
	 * 根据value值获取score
	 * @param key
	 * @param value
	 * @return
	 * @return Object
	 * @date 2015年11月25日
	 */
	Object zSetscore(String key, String value);
	/**
	 * 获取缓存大小
	 * @return
	 */
	long dbSize();


	boolean set(final byte[] key, final byte[] value);

	/**
	 * 获取byte[]类型Key
	 * @param key
	 * @return
	 */
	byte[] getByte(final byte[] key);

	/**
	 * 转换obj 为byte
	 * @param object
	 * @return
	 */
	byte[] toBytes(Object object);

	/**
	 * byte[]型转换Object
	 * @return
	 */
	Object toObject(byte[] bytes);

	boolean setNX(String key, Long value);

	Object getLock(String key);

	Long getSet(String key, Long value);

	Boolean setBit(String key, long offset, boolean value);

	BitSet getBit(String key);

}
